﻿//
// Created by wellwei on 2023/12/5.
//

/*
* Manager 类
* 用于管理书籍数据
* 通过 getInstance() 获取 Manager 实例
* 通过调用 Manager 实例的方法来进行书籍数据的增删改查
* 通过 initData() 初始化系统时，从文件中读取书籍数据
* 通过 Exit() 退出系统时，将书籍数据写入文件
*/
#pragma once

#include "Book.h"
#include "BorrowingRecord.h"
#include <unordered_map>//无序关联容器，哈希表的实现,将字符串映射到整数,通过使用键值对的方式，方便地查找、插入和删除元素，而无需关心它们的相对顺序
#include <vector>

class Manager {
private:
    static Manager* instance;               // Manager 实例
    std::vector<Book> books;                // 书籍数据，books.size() 为书籍数量
    std::vector<BorrowingRecord> borrowingRecords;    // 借阅记录
    std::unordered_map<std::string, int> bookIndex;     // 书籍索引，用于快速查找书籍判断书籍是否已存在

public:
    void initData();                       // 初始化，从文件中读取书籍数据
    void Exit();                            // 退出系统操作，将书籍数据写入文件

    static void showRecordTitle();

    void addBookSingle();                          // 添加单本书籍
    void addBookBatch();                           // 批量添加书籍

    void deleteBook();                             // 删除书籍

    void modifyBook();                              // 修改书籍

    void displayBorrowingRecords();                 // 显示所有借阅记录
    void displayBorrowingRecords(std::string status);
    void displayBorrowingRecords(std::string status1, std::string status2);

    void borrowBook(std::string borrowerID);          // 借书
    void returnBook(std::string borrowerID);          // 还书
    void renewBook(std::string borrowerID);           // 续借

    void searchBookByName();                       // 按书名查询
    void searchBookByAuthor();                     // 按作者查询
    void searchBookByISBN();                       // 按 ISBN 号查询
    void searchBookByPublisher();                  // 按出版社查询
    void searchBookByBarcode();                    // 按条码号查询
    void searchBookByClassification();             // 按分类号查询
    void searchBookByLocation();                   // 按馆藏地查询

    void displayBook();

    void displayBookByName();

    void displayBookByAuthor();

    void displayBookByISBN();

    void displayBookByPublisher();

    void displayBookByBarcode();

    void displayBookByClassification();

    void showBookTitle();

    static Manager *getInstance();        // 获取 Manager 实例
};

